package com.qinhailin.portal.qrcode.controller;

import com.jfinal.weixin.iot.msg.InEquDataMsg;
import com.jfinal.weixin.iot.msg.InEqubindEvent;
import com.jfinal.weixin.sdk.api.ApiConfigKit;
import com.jfinal.weixin.sdk.api.ApiResult;
import com.jfinal.weixin.sdk.api.UserApi;
import com.jfinal.weixin.sdk.jfinal.MsgController;
import com.jfinal.weixin.sdk.msg.in.*;
import com.jfinal.weixin.sdk.msg.in.card.*;
import com.jfinal.weixin.sdk.msg.in.event.*;
import com.jfinal.weixin.sdk.msg.in.speech_recognition.InSpeechRecognitionResults;
import com.jfinal.weixin.sdk.msg.out.*;
import com.qinhailin.common.kit.IdKit;
import com.qinhailin.common.model.WeixinUser;
import com.qinhailin.common.routes.ControllerBind;
import com.qinhailin.common.util.StrUtils;

import java.util.Map;

/**
 * 微信二维码渠道分流
 *
 * @author ygd
 * 2019年12月6日16:23:58
 */

@ControllerBind(path = "/weixin/msg")
public class WeixinMsgController extends MsgController {

    protected void processInTextMsg(InTextMsg inTextMsg) {
        String msgContent = inTextMsg.getContent().trim();
        // 帮助提示
        if ("help".equalsIgnoreCase(msgContent)) {
            OutTextMsg outMsg = new OutTextMsg(inTextMsg);
            outMsg.setContent("帮助提示");
            render(outMsg);
        }
        // 图文消息测试
        else if ("news".equalsIgnoreCase(msgContent)) {
            OutNewsMsg outMsg = new OutNewsMsg(inTextMsg);
            outMsg.addNews("图文消息title", "图文消息description", "图文消息片 url", "图文消息 url");
            render(outMsg);
        }
        // 音乐消息测试
        else if ("music".equalsIgnoreCase(msgContent)) {
            OutMusicMsg outMsg = new OutMusicMsg(inTextMsg);
            outMsg.setTitle("Day By Day");
            outMsg.setDescription("建议在 WIFI 环境下流畅欣赏此音乐");
            outMsg.setMusicUrl("http://www.jfinal.com/DayByDay-T-ara.mp3");
            outMsg.setHqMusicUrl("http://www.jfinal.com/DayByDay-T-ara.mp3");
            outMsg.setFuncFlag(true);
            render(outMsg);
        } else if ("美女".equalsIgnoreCase(msgContent)) {
            OutNewsMsg outMsg = new OutNewsMsg(inTextMsg);
            outMsg.addNews("秀色可餐", "JFinal Weixin 极速开发就是这么爽，有木有 ^_^", "http://mmbiz.qpic.cn/mmbiz/zz3Q6WSrzq2GJLC60ECD7rE7n1cvKWRNFvOyib4KGdic3N5APUWf4ia3LLPxJrtyIYRx93aPNkDtib3ADvdaBXmZJg/0", "http://mp.weixin.qq.com/s?__biz=MjM5ODAwOTU3Mg==&mid=200987822&idx=1&sn=7eb2918275fb0fa7b520768854fb7b80#rd");
            render(outMsg);
        }
        // 其它文本消息直接返回原值 + 帮助提示
        else {
            OutTextMsg outMsg = new OutTextMsg(inTextMsg);
            outMsg.setContent("\t文本消息已成功接收，内容为： " + inTextMsg.getContent() + "\n\n");
            render(outMsg);
        }
    }

    protected void processInImageMsg(InImageMsg inImageMsg) {
        OutImageMsg outMsg = new OutImageMsg(inImageMsg);
        // 将刚发过来的图片再发回去
        outMsg.setMediaId(inImageMsg.getMediaId());
        render(outMsg);
    }

    protected void processInVoiceMsg(InVoiceMsg inVoiceMsg) {
        OutVoiceMsg outMsg = new OutVoiceMsg(inVoiceMsg);
        // 将刚发过来的语音再发回去
        outMsg.setMediaId(inVoiceMsg.getMediaId());
        render(outMsg);
    }

    protected void processInVideoMsg(InVideoMsg inVideoMsg) {
		/* 腾讯 api 有 bug，无法回复视频消息，暂时回复文本消息代码测试
		OutVideoMsg outMsg = new OutVideoMsg(inVideoMsg);
		outMsg.setTitle("OutVideoMsg 发送");
		outMsg.setDescription("刚刚发来的视频再发回去");
		// 将刚发过来的视频再发回去，经测试证明是腾讯官方的 api 有 bug，待 api bug 却除后再试
		outMsg.setMediaId(inVideoMsg.getMediaId());
		render(outMsg);
		*/
        OutTextMsg outMsg = new OutTextMsg(inVideoMsg);
        outMsg.setContent("\t视频消息已成功接收，该视频的 mediaId 为: " + inVideoMsg.getMediaId());
        render(outMsg);
    }

    @Override
    protected void processInShortVideoMsg(InShortVideoMsg inShortVideoMsg) {

    }

    protected void processInLocationMsg(InLocationMsg inLocationMsg) {
        OutTextMsg outMsg = new OutTextMsg(inLocationMsg);
        outMsg.setContent("已收到地理位置消息:" +
                "\nlocation_X = " + inLocationMsg.getLocation_X() +
                "\nlocation_Y = " + inLocationMsg.getLocation_Y() +
                "\nscale = " + inLocationMsg.getScale() +
                "\nlabel = " + inLocationMsg.getLabel());
        render(outMsg);
    }

    protected void processInLinkMsg(InLinkMsg inLinkMsg) {
        OutNewsMsg outMsg = new OutNewsMsg(inLinkMsg);
        outMsg.addNews("链接消息已成功接收", "链接使用图文消息的方式发回给你，还可以使用文本方式发回。点击图文消息可跳转到链接地址页面，是不是很好玩 :)", "http://mmbiz.qpic.cn/mmbiz/zz3Q6WSrzq1ibBkhSA1BibMuMxLuHIvUfiaGsK7CC4kIzeh178IYSHbYQ5eg9tVxgEcbegAu22Qhwgl5IhZFWWXUw/0", inLinkMsg.getUrl());
        render(outMsg);
    }

    @Override
    protected void processInCustomEvent(InCustomEvent inCustomEvent) {

    }

    protected void processInFollowEvent(InFollowEvent inFollowEvent) {
        OutTextMsg outMsg = new OutTextMsg(inFollowEvent);
        // 如果为取消关注事件，将无法接收到传回的信息
        if (InFollowEvent.EVENT_INFOLLOW_SUBSCRIBE.equals(inFollowEvent.getEvent())) {
            outMsg.setContent("这是Jfinal-weixin测试服务</br>\r\n感谢您的关注");
            render(outMsg);
        }
        // 如果为取消关注事件，将无法接收到传回的信息
        if (InFollowEvent.EVENT_INFOLLOW_UNSUBSCRIBE.equals(inFollowEvent.getEvent())) {
//            logger.debug("取消关注：" + inFollowEvent.getFromUserName());
        }
    }

    //            "country":"中国",
////                    "qr_scene":0,
////                    "subscribe":1,
////                    "city":"长沙",
////                    "openid":"o31WH1LRrb19HXvDkjPXY60a1Evw",
////            "sex":1,
////                    "groupid":0,
////                    "language":"zh_CN",
////                    "remark":"",
////                    "subscribe_time":1575735614,
////                    "province":"湖南",
////                    "subscribe_scene":"ADD_SCENE_QR_CODE",
////                    "nickname":"鲸落南北",
////                    "headimgurl":"http://thirdwx.qlogo.cn/mmopen/9tK3qOaVA4D1zHlIDduhs2jmEWJDvHHBoYRD2icr0U1YIMHfMkSyaydvYmrXuwaLhIUPMbGK27Fao3yKzqFJs5rYC8zfsBH2b/132",
////                    "qr_scene_str":"4028801b6ee04fd0016ee04ffc5f0008"
    protected void processInQrCodeEvent(InQrCodeEvent inQrCodeEvent) {
        OutTextMsg outMsg = new OutTextMsg(inQrCodeEvent);
        try{
            if (InQrCodeEvent.EVENT_INQRCODE_SUBSCRIBE.equals(inQrCodeEvent.getEvent()))
            {
                String openId = inQrCodeEvent.getFromUserName();
                ApiResult userInfo = UserApi.getUserInfo(openId);
                Map<String, Object> attrs = userInfo.getAttrs();
                WeixinUser weixinUser = WeixinUser.dao.findFirst(" select * from weixin_user where openid=? and wechatId=?", openId, ApiConfigKit.getAppId());
                if(weixinUser==null){
                    weixinUser = new WeixinUser();
                }
                weixinUser.setCountry(attrs.get("country")+"");
                weixinUser.setQrScene(attrs.get("qr_scene")+"");
                weixinUser.setSubscribe(attrs.get("subscribe")+"");
                weixinUser.setCity(attrs.get("city")+"");
                weixinUser.setOpenid(attrs.get("openid")+"");
                weixinUser.setSex(attrs.get("sex")+"");
                weixinUser.setGroupid(attrs.get("groupid")+"");
                weixinUser.setRemark(attrs.get("remark")+"");
                weixinUser.setSubscribeTime(attrs.get("subscribe_time")+"");
                weixinUser.setProvince(attrs.get("province")+"");
                weixinUser.setSubscribeScene(attrs.get("subscribe_scene")+"");
                weixinUser.setNickname(attrs.get("nickname")+"");
                weixinUser.setHeadimgurl(attrs.get("headimgurl")+"");
                weixinUser.setQrSceneStr(attrs.get("qr_scene_str")+"");
                weixinUser.setWechatId(ApiConfigKit.getAppId());
                if(StrUtils.isNull(weixinUser.getId())){
                    weixinUser.setId(IdKit.createUUID());
                    weixinUser.save();
                }else{
                    weixinUser.update();
                }
                outMsg.setContent("感谢您的关注！");
                render(outMsg);
            }
            if (InQrCodeEvent.EVENT_INQRCODE_SCAN.equals(inQrCodeEvent.getEvent()))
            {
                outMsg.setContent("您已经关注了！");
                render(outMsg);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        render(outMsg);
    }

    protected void processInLocationEvent(InLocationEvent inLocationEvent) {
        OutTextMsg outMsg = new OutTextMsg(inLocationEvent);
        outMsg.setContent("processInLocationEvent() 方法测试成功");
        render(outMsg);
    }

    @Override
    protected void processInMassEvent(InMassEvent inMassEvent) {

    }

    protected void processInMenuEvent(InMenuEvent inMenuEvent) {
        OutTextMsg outMsg = new OutTextMsg(inMenuEvent);
        outMsg.setContent("processInMenuEvent() 方法测试成功");
        render(outMsg);
    }

    protected void processInSpeechRecognitionResults(InSpeechRecognitionResults inSpeechRecognitionResults) {
        OutTextMsg outMsg = new OutTextMsg(inSpeechRecognitionResults);
        outMsg.setContent("processInSpeechRecognitionResults() 方法测试成功");
        render(outMsg);
    }

    @Override
    protected void processInTemplateMsgEvent(InTemplateMsgEvent inTemplateMsgEvent) {

    }

    @Override
    protected void processInShakearoundUserShakeEvent(InShakearoundUserShakeEvent inShakearoundUserShakeEvent) {

    }

    @Override
    protected void processInVerifySuccessEvent(InVerifySuccessEvent inVerifySuccessEvent) {

    }

    @Override
    protected void processInVerifyFailEvent(InVerifyFailEvent inVerifyFailEvent) {

    }

    @Override
    protected void processInPoiCheckNotifyEvent(InPoiCheckNotifyEvent inPoiCheckNotifyEvent) {

    }

    @Override
    protected void processInWifiEvent(InWifiEvent inWifiEvent) {

    }

    @Override
    protected void processInUserCardEvent(InUserCardEvent inUserCardEvent) {

    }

    @Override
    protected void processInUpdateMemberCardEvent(InUpdateMemberCardEvent inUpdateMemberCardEvent) {

    }

    @Override
    protected void processInUserPayFromCardEvent(InUserPayFromCardEvent inUserPayFromCardEvent) {

    }

    @Override
    protected void processInMerChantOrderEvent(InMerChantOrderEvent inMerChantOrderEvent) {

    }

    @Override
    protected void processIsNotDefinedEvent(InNotDefinedEvent inNotDefinedEvent) {

    }

    @Override
    protected void processIsNotDefinedMsg(InNotDefinedMsg inNotDefinedMsg) {

    }

    @Override
    protected void processInUserGiftingCardEvent(InUserGiftingCardEvent inUserGiftingCardEvent) {

    }

    @Override
    protected void processInUserGetCardEvent(InUserGetCardEvent inUserGetCardEvent) {

    }

    @Override
    protected void processInUserConsumeCardEvent(InUserConsumeCardEvent inUserConsumeCardEvent) {

    }

    @Override
    protected void processInCardSkuRemindEvent(InCardSkuRemindEvent inCardSkuRemindEvent) {

    }

    @Override
    protected void processInCardPayOrderEvent(InCardPayOrderEvent inCardPayOrderEvent) {

    }

    @Override
    protected void processInCardPassCheckEvent(InCardPassCheckEvent inCardPassCheckEvent) {

    }

    @Override
    protected void processInEqubindEvent(InEqubindEvent inEqubindEvent) {

    }

    @Override
    protected void processInEquDataMsg(InEquDataMsg inEquDataMsg) {

    }
}
